<?php 
/**
 * 上传文件处理
 */
namespace Hdphp\Tool;
class Upload{
	//定义外部可以访问的错误信息
	public $error;  //错误信息
	private $path;	//上传路径

	public function __construct($path=null){
		$this->path=is_null($path) ? './upload/'.date('Ymd').'/' : $path;
	}

	public function up(){

		return $this->_filter( $this->_resetArr() );

	}

	// 1重组 数组
	private function _resetArr(){
		$temp=array();//定义空数组 存储组合后的数组
		foreach ($_FILES as $value) {

			if( is_array($value['name']) ){
				foreach ($value['name'] as $k=>$v){
					// 给新的二维数组赋值
					$temp[]=array(
						'name'=>$v,
						'type'=>$value['type'][$k],
						'tmp_name'=>$value['tmp_name'][$k],
						'error'=>$value['error'][$k],
						'size'=>$value['size'][$k],
					);
				}
			}else{
				$temp[]=$value;
			}
			return $temp;	//返回重组后的新数组 的位置
		}
	}

	// 2过滤数组
	private function _filter($arr){
		$tempArr=array();
		foreach ($arr as $value) {
			if( !$this->error($value) ){
				//上传失败
				return false;
			}else{
				//上传成功 移动文件名 并且把上传的文件路径添加到数组中
				$tempArr[]=$this->_moveFile($value,$this->path);
			}
		}
		//数组返回上传文件的路径
		return $tempArr;
	} 
	
	// 错误过滤判断
	private function error($value){

		$type=ltrim(strrchr($value['name'],'.'),'.');
		switch (true) {
			//是否上传
			case $value['error'] == 4:
				$this->error='没有上传文件';
				return false;
			//是否合法文件
			case !is_uploaded_file($value['tmp_name']):
				$this->error='不是合法的上传文件';
				return false;
			// 类型
			case !in_array($type, array('jpg','png','gif','bmp','jpeg')):
				$this->error='文件类型不正确';
				return false;

			case $value['error'] == 1:
				$this->error='文件大小超出限制';
				return false;

			case $value['error'] == 2:
				$this->error='文件大小超出限制';
				return false;

			case $value['error'] == 3;
				$this->error='文件只有部分上传';
				return false;

			default:
				return true;
		}
	}

	//重新命名 移动文件 返回路径
	private function _moveFile($file,$path){

		$type=ltrim(strrchr($file['name'], '.'),'.');

		$newFile=time().mt_rand(0,9999).".{$type}";

		is_dir($path) || mkdir($path,0777,true);

		$fullPath=$path.$newFile;

		move_uploaded_file($file['tmp_name'], $fullPath);
		//返回文件路径
		return $fullPath;
	}


}

 ?>